Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / feature / node / src / commonTest / kotlin / org / meshtastic / feature / node / detail / NodeManagementActionsTest.kt

Displaying Raw • Download

feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/detail/NodeManagementActionsTest.kt 65a1f5ce4d0e4b8eafcd0bbfccafd41dc6ee888a (65a1f5ce) Text, 6.67 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.detail

Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.answering.throws
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787kotlinx.coroutines.ExperimentalCoroutinesApi
Tff7b72import T7ee787kotlinx.coroutines.test.StandardTestDispatcher
Tff7b72import T7ee787kotlinx.coroutines.test.TestScope
Tff7b72import T7ee787kotlinx.coroutines.test.runCurrent
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.repository.LocalNodeUnavailableException
Tff7b72import T7ee787org.meshtastic.core.repository.PacketQueueRejectedException
Tff7b72import T7ee787org.meshtastic.core.repository.PlatformAnalytics
Tff7b72import T7ee787org.meshtastic.core.repository.RadioController
Tff7b72import T7ee787org.meshtastic.core.testing.FakeNodeRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController
Tff7b72import T7ee787org.meshtastic.core.ui.util.AlertManager
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertTrue

Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalCoroutinesApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72class T56d364NodeManagementActionsTest Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3nodeRepository Tff7b72= Te6edf3FakeNodeRepositoryTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3radioController Tff7b72= Te6edf3FakeRadioControllerTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3alertManager Tff7b72= Te6edf3mockTff7b72<Te6edf3AlertManagerTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3snackbarManager Tff7b72= Te6edf3RecordingSnackbarManagerTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3testDispatcher Tff7b72= Te6edf3StandardTestDispatcherTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3testScope Tff7b72= Te6edf3TestScopeTb4b4b4(Te6edf3testDispatcherTb4b4b4)
Tff7b72private Tff7b72val Te6edf3resolveUiText Tff7b72= Te6edf3resolveNodeRequestFailureUiText
Tff7b72private Tff7b72val Te6edf3analytics Tff7b72= Te6edf3mockTff7b72<Te6edf3PlatformAnalyticsTff7b72>Tb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)

Tff7b72private Tff7b72val Te6edf3actions Tff7b72= Te6edf3actionsWithTb4b4b4(Te6edf3radioControllerTb4b4b4, Te6edf3alertManagerTb4b4b4)

Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3snackbarManagerTb4b4b4.Te6edf3messagesTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffactionsWithTb4b4b4(Te6edf3radioTb4b4b4: Te6edf3RadioControllerTb4b4b4, Te6edf3alertsTb4b4b4: Te6edf3AlertManagerTb4b4b4) Tff7b72= Te6edf3NodeManagementActionsTb4b4b4(
Te6edf3nodeRepository Tff7b72= Te6edf3nodeRepositoryTb4b4b4,
Te6edf3radioController Tff7b72= Te6edf3radioTb4b4b4,
Te6edf3alertManager Tff7b72= Te6edf3alertsTb4b4b4,
Te6edf3analytics Tff7b72= Te6edf3analyticsTb4b4b4,
Te6edf3snackbarManager Tff7b72= Te6edf3snackbarManagerTb4b4b4,
Te6edf3resolveUiText Tff7b72= Te6edf3resolveUiTextTb4b4b4,
Tb4b4b4)

Tf0883e@Test
Tff7b72fun Td2a8ffrequestRemoveNode_shows_confirmation_alertTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4)Tb4b4b4)

Te6edf3actionsTb4b4b4.Te6edf3requestRemoveNodeTb4b4b4(Te6edf3testScopeTb4b4b4, Te6edf3nodeTb4b4b4)

Te6edf3verify Tb4b4b4{
Te6edf3alertManagerTb4b4b4.Te6edf3showAlertTb4b4b4(
Te6edf3titleRes Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3messageRes Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onConfirm Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3confirmText Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3confirmTextRes Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dismissText Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3dismissTextRes Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3choices Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrequestRemoveNode_invokes_onAfterRemove_when_user_confirmsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3realAlertManager Tff7b72= Te6edf3AlertManagerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3actionsWithRealAlert Tff7b72= Te6edf3actionsWithTb4b4b4(Te6edf3radioControllerTb4b4b4, Te6edf3realAlertManagerTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72var Te6edf3afterRemoveCalled Tff7b72= Tff7b72false

Te6edf3actionsWithRealAlertTb4b4b4.Te6edf3requestRemoveNodeTb4b4b4(Te6edf3testScopeTb4b4b4, Te6edf3nodeTb4b4b4) Tb4b4b4{ Te6edf3afterRemoveCalled Tff7b72= Tff7b72true Tb4b4b4}
Te6edf3realAlertManagerTb4b4b4.Te6edf3currentAlertTb4b4b4.Te6edf3valueTff7b72?.Te6edf3onConfirmTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3testScopeTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3afterRemoveCalledTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrequestRemoveNode_success_callback_failure_is_not_reported_as_radio_rejectionTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3realAlertManager Tff7b72= Te6edf3AlertManagerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3actionsWithRealAlert Tff7b72= Te6edf3actionsWithTb4b4b4(Te6edf3radioControllerTb4b4b4, Te6edf3realAlertManagerTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4)

Te6edf3actionsWithRealAlertTb4b4b4.Te6edf3requestRemoveNodeTb4b4b4(Te6edf3testScopeTb4b4b4, Te6edf3nodeTb4b4b4) Tb4b4b4{ Tff7b72throw Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffcallbackTa5d6ff"Tb4b4b4) Tb4b4b4}
Te6edf3realAlertManagerTb4b4b4.Te6edf3currentAlertTb4b4b4.Te6edf3valueTff7b72?.Te6edf3onConfirmTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3testScopeTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertTrueTb4b4b4(Te6edf3snackbarManagerTb4b4b4.Te6edf3messagesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrequestRemoveNode_queue_rejection_keeps_success_callback_pending_and_surfaces_feedbackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3rejectedRadio Tff7b72= Te6edf3mockTff7b72<Te6edf3RadioControllerTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3realAlertManager Tff7b72= Te6edf3AlertManagerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3rejectedActions Tff7b72= Te6edf3actionsWithTb4b4b4(Te6edf3rejectedRadioTb4b4b4, Te6edf3realAlertManagerTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72var Te6edf3afterRemoveCalled Tff7b72= Tff7b72false
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3rejectedRadioTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns T79c0ff7
Te6edf3everySuspend Tb4b4b4{ Te6edf3rejectedRadioTb4b4b4.Te6edf3removeByNodenumTb4b4b4(T79c0ff7Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3PacketQueueRejectedExceptionTb4b4b4(Ta5d6ff"Ta5d6ffRemove nodeTa5d6ff"Tb4b4b4)

Te6edf3rejectedActionsTb4b4b4.Te6edf3requestRemoveNodeTb4b4b4(Te6edf3testScopeTb4b4b4, Te6edf3nodeTb4b4b4) Tb4b4b4{ Te6edf3afterRemoveCalled Tff7b72= Tff7b72true Tb4b4b4}
Te6edf3realAlertManagerTb4b4b4.Te6edf3currentAlertTb4b4b4.Te6edf3valueTff7b72?.Te6edf3onConfirmTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3testScopeTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3afterRemoveCalledTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3nodeTb4b4b4, Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTff7b72[T79c0ff1T79c0ff2T79c0ff3Tff7b72]Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3NODE_REQUEST_SEND_FAILED_TEXTTb4b4b4)Tb4b4b4, Te6edf3snackbarManagerTb4b4b4.Te6edf3messagesTb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffrequestRemoveNode_local_node_loss_keeps_success_callback_pending_and_surfaces_feedbackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3unavailableRadio Tff7b72= Te6edf3mockTff7b72<Te6edf3RadioControllerTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3realAlertManager Tff7b72= Te6edf3AlertManagerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3unavailableActions Tff7b72= Te6edf3actionsWithTb4b4b4(Te6edf3unavailableRadioTb4b4b4, Te6edf3realAlertManagerTb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72var Te6edf3afterRemoveCalled Tff7b72= Tff7b72false
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3nodeTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3unavailableRadioTb4b4b4.Te6edf3generatePacketIdTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns T79c0ff7
Te6edf3everySuspend Tb4b4b4{ Te6edf3unavailableRadioTb4b4b4.Te6edf3removeByNodenumTb4b4b4(T79c0ff7Tb4b4b4, T79c0ff1T79c0ff2T79c0ff3Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3LocalNodeUnavailableExceptionTb4b4b4(Ta5d6ff"Ta5d6ffRemove nodeTa5d6ff"Tb4b4b4)

Te6edf3unavailableActionsTb4b4b4.Te6edf3requestRemoveNodeTb4b4b4(Te6edf3testScopeTb4b4b4, Te6edf3nodeTb4b4b4) Tb4b4b4{ Te6edf3afterRemoveCalled Tff7b72= Tff7b72true Tb4b4b4}
Te6edf3realAlertManagerTb4b4b4.Te6edf3currentAlertTb4b4b4.Te6edf3valueTff7b72?.Te6edf3onConfirmTff7b72?.Te6edf3invokeTb4b4b4(Tb4b4b4)
Te6edf3testScopeTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)

Te6edf3assertFalseTb4b4b4(Te6edf3afterRemoveCalledTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3nodeTb4b4b4, Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTff7b72[T79c0ff1T79c0ff2T79c0ff3Tff7b72]Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3listOfTb4b4b4(Te6edf3NODE_REQUEST_SEND_FAILED_TEXTTb4b4b4)Tb4b4b4, Te6edf3snackbarManagerTb4b4b4.Te6edf3messagesTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.06s